/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quanlisinhvien.core;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Marshmallow
 */
public class MyConnectUnit {
    
    //Biến kết nối
    public MySQLConnect connect;
    
    public MyConnectUnit(){
        this.connect = new MySQLConnect();
    }

    public MyConnectUnit(MySQLConnect connect) {
        this.connect = connect;
    }
    
    //Hàm Select CSDL
    //SELECT * FROM TableName WHERE Condition ORDER BY OrderBy
    public ResultSet Select(String tenBang, String dieuKien, String orderBy) throws Exception{
        //Tạo câu truy vấn Select
        StringBuilder query = new StringBuilder("SELECT * FROM " + tenBang );
        //Đưa câu lệnh điều kiện vào câu truy vấn
        this.AddCondition(query, dieuKien);
        //Đưa câu lệnh order vào câu truy vấn
        this.AddOrderBy(query, orderBy);
        //Chèn kí tự ';' vào cuối câu truy vấn
        query.append(";");
        return this.connect.executeQuery(query.toString());
    }
    
    //Overloading hàm Select
    public ResultSet Select(String tenBang, String dieuKien) throws Exception{
        return this.Select(tenBang, dieuKien, "");
    }
    
    //Overloading hàm Select
    public ResultSet Select(String tenBang) throws Exception{
        return this.Select(tenBang, "", "");
    }
    
    //Hàm thêm điều kiện vào query
    public void AddCondition(StringBuilder query, String condition){
        if(!condition.equals("")){
            query.append(" WHERE ");
            query.append(condition);
        }
    }
    
    //Hàm thêm OrderBy vào query
    public void AddOrderBy(StringBuilder query, String orderBy){
        if(!orderBy.equals("")){
            query.append(" ORDER BY ");
            query.append(orderBy);
        }
    }
    
    public boolean Insert(String tenBang, List<Object> giaTriCot) throws Exception{
        //Tạo câu truy vấn Insert
        StringBuilder query = new StringBuilder("INSERT INTO " + tenBang);
        //Tạo chuỗi values
        StringBuilder giatriNhap = new StringBuilder();
        
        query.append(" (");
        List<String> fields = this.getFieldName(tenBang);
        
        //Duyệt và đưa thông tin cột vào query và giá trị vào giaTriNhap
        for (int i = 0; i < fields.size(); i++){
            query.append(String.format("%s, ", fields.get(i)));
            giatriNhap.append(String.format("'%s', ", giaTriCot.get(i)));
        }
        //Cắt bớt chuỗi ', ' cuối câu
        query = query.delete(query.length()-2, query.length());
        giatriNhap = giatriNhap.delete(giatriNhap.length()-2, giatriNhap.length());
        
        //Đưa giá trị vào query
        query.append(String.format(") VALUES(%s) ;", giatriNhap.toString()));
        //Thực thi câu truy vấn và trả kết quả ra ngoài 
        //Nếu executeUpdate trả về giá trị >0 thì insert thành công
        
        System.out.println(query.toString());
        return this.connect.executeUpdate(query.toString()) >0 ;
    }
    
    public boolean Update(String tenBang, List<Object> giaTriCot, String dieuKien) throws Exception{
        //Tạo câu truy vấn Update
        StringBuilder query = new StringBuilder("UPDATE " + tenBang + " SET ");
        
        List<String> fields = this.getFieldName(tenBang);
        
        //Duyệt và đưa thông tin tên cột và giá trị của cột vào câu truy vấn
        for (int i = 0; i < fields.size(); i++){
            query.append(String.format("%s = '%s', ", fields.get(i), giaTriCot.get(i)));
        }
        
        //Cắt bớt chuỗi ", " cuối câu
        query = query.delete(query.length()-2, query.length());
        //Đưa câu lệnh điều kiện vào query
        this.AddCondition(query, dieuKien);
        query.append(";");
        System.out.println(query.toString());
        //Thực thi câu truy vấn và trả kết quả ra ngoài 
        return this.connect.executeUpdate(query.toString()) > 0;
    }
    
    public boolean Delete(String tenBang, String dieuKien) throws Exception{
        StringBuilder query = new StringBuilder("DELETE FROM " + tenBang);
        //Đưa câu lệnh điều kiện vào trong query
        this.AddCondition(query, dieuKien);
        query.append(";");
        return this.connect.executeUpdate(query.toString()) > 0;
    }
      
    public List<String> getFieldName(String tenBang) throws Exception{
        ResultSet rs = this.Select(tenBang);
        ResultSetMetaData md = rs.getMetaData();
        int col = md.getColumnCount();
        List<String> ketQua = new ArrayList<String>();
        for (int i = 1; i <= col; i++){
           String col_name = md.getColumnName(i);
           ketQua.add(col_name);
        }
        return ketQua;                
    }
    
}
